home *** CD-ROM | disk | FTP | other *** search
/ MacHack 1997 / MacHack 1997.toast / Hacks / Hacks ’97 / Energizer Bug / source code / EnergyStar.c < prev    next >
Encoding:
C/C++ Source or Header  |  1997-06-27  |  5.1 KB  |  192 lines  |  [TEXT/MPS ]

  1. /*
  2.     File:        Vol.c
  3.  
  4.     Contains:    A dcmd which dumps all volumes from the VCB queue.
  5.  
  6.     Written by:    JM3 = Jim Murphy
  7.                 DAL = Dave Lyons
  8.                 sad = Scott Douglas
  9.  
  10.     Copyright:    © 1988,1993-1994, 1996 by Apple Computer, Inc., all rights reserved.
  11.  
  12.     Change History (most recent first):
  13.  
  14.          <6>   25-Jan-96    JM3        Updated the sample build commands to be current. Took out lowmem
  15.                                     define and included LowMem.h.
  16.          <5>   11-Dec-94    JM3        Updated for new version 3 dcmd requirements.
  17.          <4>   24-Jan-94    JM3        EqualString is now in TextUtils.h with the Universal Interfaces.
  18.          <2>     9/10/93    DAL        Fixed volume-name matching to work again (was using
  19.                                     non-prototyped "EQUALSTRING" instead of EqualString).  Widened
  20.                                     the volume-name column.  Changed "VCB at" to "VCB addr" and made
  21.                                     it align for 32-bit addresses.
  22.  
  23.     Modification history:
  24.         29Nov88 sad        revised for new dcmd names.  display more info.
  25.          5Oct88 sad        written.
  26.  
  27.     The following MPW commands will build the dcmd and copy it to the "Debugger Prefs" file
  28.     in the System folder. The dcmd's name in MacsBug will be the name of the file built by
  29.     the Linker.
  30.  
  31.     SC EnergyStar.c
  32.     Link -o EnergyStar -sg Main=STDCLIB,STDIO,SANELIB dcmdGlue.a.o EnergyStar.c.o "{Libraries}Runtime.o"
  33.     BuildDcmd EnergyStar 198 -format3
  34.     Echo 'include "EnergyStar";'    |    Rez -a -o "{systemFolder}Debugger Prefs"
  35.  
  36. */
  37.  
  38. #include <Types.h>
  39. #include <Memory.h>
  40. #include <OSUtils.h>
  41. #include <Files.h>
  42. #include <TextUtils.h>
  43. #include <Devices.h>
  44. #include <Video.h>
  45. #include <LowMem.h>
  46.  
  47. #include "dcmd.h"
  48. #include "put.h"
  49.  
  50. //==============================================================================
  51. #define kESSignature         'HAL '
  52. #define kEnergyStarOn         kDPMSSyncOn            // See Video.h
  53. #define kEnergyStarSuspend    kDPMSSyncSuspend    // See video.h
  54. #define kEnergyStarOff         kDPMSSyncOff        // See Video.h
  55.  
  56. typedef struct {
  57.     char    code1;        // kEnergyStarOn or kEnergyStarOff
  58.     char    code2;        // kEnergyStarOn or kEnergyStarOff
  59.     long    type;        // 0L in status call, kESSignature in control calls
  60. } ESData;
  61.  
  62. //==============================================================================
  63. Boolean EnergyStarSupported(GDHandle device)
  64. {
  65.     CntrlParam    param;
  66.     ESData        data;
  67.     
  68.     data.code1            = 0x00;
  69.     data.code2            = 0x00;
  70.     data.type            = 0x00000000;
  71.     param.ioCompletion    = 0L;
  72.     param.ioCRefNum        = (**device).gdRefNum;
  73.     param.csCode        = 11;
  74.     *(ESData**)¶m.csParam[0] = &data;
  75.     
  76.     // return (PBStatusSync((ParmBlkPtr)¶m) == noErr);
  77.     return (PBStatus((ParmBlkPtr)¶m, false) == noErr);
  78. }
  79.  
  80. //==============================================================================
  81. short EnergyStarState(GDHandle device)
  82. {
  83.     CntrlParam    param;
  84.     ESData        data;
  85.     OSErr       err;
  86.     long        startTicks;
  87.     
  88.     startTicks = LMGetTicks();
  89.  
  90.     do
  91.     {
  92.         data.code1            = 0x00;
  93.         data.code2            = 0x00;
  94.         data.type            = 0x00000000;
  95.         param.ioCompletion    = 0L;
  96.         param.ioCRefNum        = (**device).gdRefNum;
  97.         param.csCode        = 11;
  98.         *(ESData**)¶m.csParam[0] = &data;
  99.         
  100.     // } while((err = PBStatusSync((ParmBlkPtr)¶m)) != noErr &&
  101.     } while((err = PBStatus((ParmBlkPtr)¶m, false)) != noErr &&
  102.                     LMGetTicks() - startTicks < 300);
  103.  
  104.     if(err)
  105.         return kEnergyStarOff;
  106.     else
  107.         return data.code1;
  108. }
  109.  
  110. //==============================================================================
  111. OSErr SwitchEnergyStar(GDHandle device, short state)
  112. {
  113.     CntrlParam    param;
  114.     ESData        data;
  115.     OSErr        err;
  116.     short        oldState, mask;
  117.     long        startTicks;
  118.     
  119.     if((oldState = EnergyStarState(device)) == 0x7)
  120.         mask = kDPMSSyncMask;
  121.     else
  122.         mask = state;
  123.     
  124.     startTicks = LMGetTicks();
  125.  
  126.     do
  127.     {
  128.         data.code1            = state;
  129.         data.code2            = mask;
  130.         data.type            = kESSignature;
  131.         param.ioCompletion    = 0L;
  132.         param.ioCRefNum        = (**device).gdRefNum;
  133.         param.csCode        = 11;
  134.         *(ESData**)¶m.csParam[0] = &data;
  135.         
  136.     } while((err = PBControlSync((ParmBlkPtr)¶m)) != noErr &&
  137.                     LMGetTicks() - startTicks < 300);
  138.  
  139.     return err;
  140. }
  141.  
  142. //==============================================================================
  143. pascal void CommandEntry(dcmdBlock* paramPtr)
  144. {
  145.  
  146.     static const char usageStr[] = "\p[on | off]";
  147. #include "Picture.h"
  148.  
  149.     switch (paramPtr->request)
  150.     {
  151.         case dcmdInit:
  152.             break;
  153.  
  154.         case dcmdHelp:
  155.             dcmdDrawLine("\pTurns on a monitor that Energy Saver has powered down.");
  156.             dcmdDrawLine("\p(Obviously, you'll have to type this command blind if you need it :-)");
  157.             break;
  158.  
  159.         case dcmdGetInfo:
  160.             * (long *) &((GetInfoRequestBlockPtr) paramPtr->requestIOBlock)->dcmdVersion = 0x01008000; // version 1.0 final
  161.             BlockMoveData(&usageStr, &((GetInfoRequestBlockPtr) paramPtr->requestIOBlock)->usageStr, usageStr[0]+1);
  162.             break;
  163.  
  164.         case dcmdDoIt:
  165.         {
  166.             GDHandle    device;
  167.             Str255        command;
  168.             short        ii;
  169.             
  170.             (void) dcmdGetNextParameter(command);
  171.             
  172.             if((device = GetMainDevice()) != NULL && EnergyStarSupported(device))
  173.                 if(command[0] > 1 && (command[2] == 'f' || command[2] == 'F'))
  174.                     SwitchEnergyStar(device, kEnergyStarSuspend);
  175.                 else
  176.                     SwitchEnergyStar(device, kEnergyStarOn);
  177.             for(ii = 0; ii < NUM_LINES; ii++)
  178.             {
  179.                 dcmdDrawLine(starts[ii]);
  180.                 dcmdDrawString(ends[ii]);
  181.             }
  182.             break;
  183.         }
  184.  
  185.         // Version 3 and newer dcmds must quietly ignore requests we don't recognize.
  186.  
  187.         default:
  188.             break;
  189.     }
  190.  
  191. } // CommandEntry
  192.